home *** CD-ROM | disk | FTP | other *** search
/ InfoMagic Internet Tools 1993 July / Internet Tools.iso / RockRidge / mail / mmdf / mmdf-IIb.43 / uip / other / resend.c < prev    next >
Encoding:
C/C++ Source or Header  |  1986-05-07  |  8.1 KB  |  379 lines

  1. #include "util.h"                 /* to get mmdf reply codes            */
  2. #include "mmdf.h"                 /* to get mmdf reply codes            */
  3. #include "cnvtdate.h"
  4. #include <pwd.h>
  5. #include <signal.h>
  6. #include <sys/stat.h>
  7.  
  8. extern char     *locname;
  9. extern char     *locdomain;
  10.  
  11. char   *logdir;
  12. char   *username;
  13.  
  14. extern    char *strdup();
  15. extern  char *index();
  16.  
  17. char    noret;                    /* no return address                  */
  18. char    watchit;                  /* user wants to watch delivery       */
  19. int    hadto;
  20.  
  21. #define FRMNONE 0                 /* no From field specified            */
  22. #define FRMTXT  1                 /* From field had text only           */
  23. #define FRMSNDR 2                 /* field had sender info, too         */
  24.  
  25.  
  26. /*  **************************  MAIN  ******************************* */
  27.  
  28. main (argc, argv)
  29. int     argc;
  30. char   *argv[];
  31. {
  32.     mmdf_init (argv[0]);
  33.  
  34.     pgminit ();
  35.  
  36.     get_aliasfile ();
  37.  
  38.     sendmail (argc, argv);
  39. }
  40.  
  41. pipsig ()
  42. {
  43.     if (rp_gval (endchild (NOTOK)) == RP_NO)
  44.         err_abrt(RP_LIO, "Abnormal return from submit");
  45.     exit (NOTOK);
  46. }
  47.  
  48. pgminit ()
  49. {
  50.     extern struct passwd *getpwuid ();
  51.     extern char *getmailid ();
  52.     struct passwd  *pwdptr;
  53.     int     realid,
  54.     effecid;
  55.  
  56.     signal (SIGPIPE, pipsig);    /* catch write to bad pipe            */
  57.  
  58.     getwho (&realid, &effecid);   /* who am i?                          */
  59.  
  60.     if ((pwdptr = getpwuid (realid)) == (struct passwd *) NULL)
  61.         err_abrt (RP_PARM, "Unable to locate user's name");
  62.  
  63.     /*  save login directory   */
  64.     logdir = strdup(pwdptr -> pw_dir);
  65.  
  66.     if ((username = getmailid(pwdptr -> pw_name)) == NULL)
  67.         err_abrt (RP_PARM, "Unable to locate user's mailid");
  68. }
  69.  
  70. #define    NARGS    20
  71.  
  72. get_aliasfile ()
  73. {
  74.     struct passwd  *pwdptr;
  75.     char    rcfilename[128];
  76.     char    linebuf[128];
  77.     char    *rcname = ".sendrc";
  78.     char     *av[NARGS+1], *aliasfile[128];
  79.     FILE     *fp;
  80.     int     realid, effecid;
  81.  
  82.     getwho (&realid, &effecid);
  83.  
  84.     if ((pwdptr = getpwuid (realid)) == (struct passwd *) NULL)
  85.         err_abrt (RP_PARM, "Unable to locate user's name");
  86.  
  87.     /* Get info from the ".sendrc" file */
  88.  
  89.     sprintf( rcfilename, "%s/%s", pwdptr->pw_dir, rcname );
  90.     if(( fp = fopen(rcfilename, "r")) != NULL ) {
  91.         char *cp;
  92.  
  93.         /* Process info a line at a time until we find the alias file */
  94.         while( fgets(linebuf, sizeof(linebuf), fp ) != NULL )  {
  95.             if (cp = index(linebuf, '\n'))
  96.                 *cp = 0;
  97.             if (sstr2arg(linebuf, NARGS, av, " \t") < 0)
  98.                 continue;
  99.             if ( strncmp(linebuf,"aliases",7) == 0 )  {
  100.  
  101.                 if (av[1][0] != '/')  {
  102.                     sprintf( aliasfile, "%s/%s", pwdptr->pw_dir, av[1]);
  103.                     aliasinit ( aliasfile );
  104.                 } else
  105.                     aliasinit ( av[1] );
  106.  
  107.             }    /* end of if on strncmp */
  108.         }    /* end of while on lines */
  109.     
  110.     }    /* end of if statement on file open */
  111. }    /* end of get_aliasfile routine */
  112.  
  113.  
  114. /*^L*/
  115.  
  116. static char regargs[] = "rmxresent-to,resent-cc*";
  117. /* return to sender, mail, extract addrs from to & cc   */
  118.  
  119. sendmail (argc, argv)             /* Send a message                     */
  120. int     argc;
  121. char   *argv[];
  122. {
  123.     extern char *sbargs ();
  124.     int     retval;
  125.     char    linebuf[ADDRSIZE];
  126.     char   *sbmtargs;
  127.  
  128.     if (rp_isbad (mm_init ()) || rp_isbad (mm_sbinit ()))
  129.         err_abrt (RP_MECH, "Unable to submit mail; please report this error");
  130.  
  131.     strcpy (linebuf, regargs);    /* standard stuff                     */
  132.  
  133.     if ((sbmtargs = sbargs (argc, argv)) != 0)
  134.         /* any args to be args to submit?       */
  135.         strcat (linebuf, sbmtargs);
  136.  
  137.     if (noret)
  138.         strcat (linebuf, "q");    /* quiet, do not return on errors  */
  139.     if (watchit)
  140.         strcat (linebuf, "w");    /* user want so watch the process     */
  141.  
  142.     if (rp_isbad (mm_winit ((char *) 0, linebuf, (char *) 0)))
  143.         err_abrt (RP_MECH, "problem with submit message initialization");
  144.  
  145.     dumpheader();
  146.     doresent(argc, argv);
  147.  
  148.     if (!hadto)
  149.         err_abrt (RP_PARM, "No addressees specified");
  150.  
  151.     dobody ();
  152.     retval = endbody ();
  153.  
  154.     endchild (OK);
  155.  
  156.     exit ((rp_isbad (retval)) ? NOTOK : OK);
  157. }
  158. /*   *************  ARGUMENT PARSING FOR SENDMAIL  **************  */
  159.  
  160. char *
  161. sbargs (argc, argv)               /* any args to be args to submit?   */
  162. int     argc;
  163. char   *argv[];
  164. {
  165.     register int    i;
  166.     char   *argptr;
  167.  
  168.     for (i = 1, argptr = 0; i < argc; i++)
  169.     {                             /* create message header fields */
  170.         if (argv[i][0] == '-')
  171.             switch (argv[i][1])
  172.             {
  173.             case '-':
  174.                 argptr = &(argv[i][2]);
  175.                 continue;
  176.  
  177.             case 'r':
  178.                 noret = TRUE;
  179.                 break;
  180.  
  181.             case 'w':
  182.                 watchit = TRUE;
  183.                 break;
  184.             }
  185.     }
  186.     return (argptr);
  187. }
  188.  
  189. /* */
  190.  
  191. dumpheader()
  192. {
  193.     char    line[LINESIZE];
  194.  
  195.     while (fgets (line, LINESIZE, stdin) != NULL) {
  196.         if (line[0] == '\n')
  197.             break;
  198.         if (prefix ("resent-", line))
  199.             mm_wtxt ("Old-", 4);
  200.         mm_wtxt (line, strlen (line));
  201.     }
  202. }
  203.  
  204. doresent(argc, argv)
  205. int    argc;
  206. char    **argv;
  207. {
  208.     char    datbuf[64];
  209.  
  210.     cnvtdate (TIMREG, datbuf);        /* rfc822 format date */
  211.     sndhdr ("Resent-Date:  ", datbuf);
  212.     dosender ();
  213.     doto (argc, argv);
  214.     mm_wtxt ("\n", 1);
  215. }
  216.  
  217. sndhdr (name, contents)
  218. char    name[],
  219. contents[];
  220. {
  221.     char    linebuf[LINESIZE];
  222.  
  223.     sprintf (linebuf, "%-10s%s\n", name, contents);
  224.     mm_wtxt (linebuf, strlen (linebuf));
  225. }
  226.  
  227. dosender ()
  228. {
  229.     int     sigfd;
  230.     int    sigsiz;
  231.     char    linebuf[ADDRSIZE];
  232.     char    sigtxt[FILNSIZE];     /* where is signature text?           */
  233.     char    gotsig;
  234.  
  235.     gotsig = FALSE;
  236.  
  237.     sprintf (linebuf, "%s/.signature", logdir);
  238.  
  239.     if ((sigfd = open (linebuf, 0)) >= 0)
  240.     {                         /* there is a file w/signature?       */
  241.         sigsiz = read (sigfd, sigtxt, sizeof sigtxt);
  242.         if (sigsiz > 0) {
  243.             sigtxt[sigsiz - 1] = '\0';
  244.             gotsig = TRUE;
  245.         }
  246.     }
  247.  
  248.     if (gotsig)                   /* real name + mailbox                */
  249.         sprintf (linebuf, "%s <%s@%s.%s>",
  250.              sigtxt, username, locname, locdomain);
  251.     else                          /* just the mailbox info              */
  252.         sprintf (linebuf, "%s@%s.%s", username, locname, locdomain);
  253.  
  254.     sndhdr ("Resent-From:  ", linebuf);
  255. }
  256. /* */
  257.  
  258. doto (argc, argv)
  259. int     argc;
  260. char   *argv[];
  261. {
  262.     char    linebuf[ADDRSIZE];
  263.     char    someto;
  264.     register int    i;
  265.  
  266.     someto = FALSE;
  267.     i = 1;
  268.     while( i < argc )
  269.     {
  270.         linebuf[0] = '\0';
  271.         if( argv[i][0] != '-' )
  272.         {
  273.             someto = TRUE;
  274.             aliasmap( linebuf, argv[i], locname );
  275.             sndhdr( "Resent-To:  ", linebuf );
  276.         }
  277.         else switch( argv[i][1] )
  278.         {
  279.         case 't':
  280.             someto = TRUE;
  281.             i++;
  282.             aliasmap( linebuf, argv[i], locname );
  283.             sndhdr( "Resent-To:  ", linebuf );
  284.             break;
  285.         case 'c':
  286.             someto = TRUE;
  287.             i++;
  288.             aliasmap( linebuf, argv[i], locname );
  289.             sndhdr( "Resent-Cc:  ", linebuf );
  290.             break;
  291.         case 'w':
  292.         case 'r':
  293.         case '-':
  294.             break;
  295.         default:
  296.             fprintf(stderr,"Unknown flag '%c'\n",argv[i][1]);
  297.             break;
  298.         }
  299.         i++;
  300.     }
  301.         
  302.     hadto = (someto ? TRUE : FALSE);
  303.     return;
  304. }
  305.  
  306. dolist (i, argc, argv, dest)
  307. register int    i;
  308. int     argc;
  309. char   *argv[];
  310. char   *dest;                     /* where to put the list                */
  311. {
  312.     *dest = '\0';                 /* in case nothing found                */
  313.     if (i < argc && *argv[i] != '-')
  314.     for (strcat (dest, argv[i++]); i < argc && *argv[i] != '-';
  315.         strcat (dest, ", "), strcat (dest, argv[i++]));
  316.  
  317.     return (i - 1);
  318. }
  319. /* */
  320.  
  321. dobody ()
  322. {
  323.     char    buffer[BUFSIZ];
  324.     register int    i;
  325.  
  326.     while (!feof (stdin) && !ferror (stdin) &&
  327.         (i = fread (buffer, sizeof (char), sizeof (buffer), stdin)) > 0)
  328.         if (rp_isbad (i = mm_wtxt (buffer, i)))
  329.             err_abrt (i, "Problem writing body");
  330.  
  331.     if (ferror (stdin))
  332.         err_abrt (RP_FIO, "Problem reading body");
  333. }
  334.  
  335. endbody ()
  336. {
  337.     struct rp_bufstruct thereply;
  338.     int     len;
  339.  
  340.     if (rp_isbad (mm_wtend ()))
  341.         err_abrt (RP_MECH, "problem ending submission");
  342.  
  343.     if (rp_isbad (mm_rrply (&thereply, &len)))
  344.         err_abrt (RP_MECH, "problem getting submission status");
  345.  
  346.     if (rp_isbad (thereply.rp_val))
  347.         err_abrt (thereply.rp_val, "%s", thereply.rp_line);
  348.  
  349.     return (thereply.rp_val);
  350. }
  351.  
  352. /*  *********************  UTILITIES  ***************************  */
  353.  
  354. endchild (type)
  355. int     type;
  356. {
  357.     int retval;
  358.  
  359.  
  360.     if (rp_isgood (retval = mm_sbend ()))
  361.         retval = mm_end (type);
  362.  
  363.     return ((retval == NOTOK) ? RP_FIO : (retval >> 8));
  364. }
  365.  
  366. /* VARARGS2 */
  367.  
  368. err_abrt (code, fmt, b, c, d)     /* terminate the process              */
  369. int     code;                     /* a mmdfrply.h termination code      */
  370. char   *fmt, *b, *c, *d;
  371. {
  372.     if (fmt)
  373.         printf (fmt, b, c, d);
  374.     printf ("\nMessage resending aborted\n");
  375.     fflush (stdout);
  376.     endchild (NOTOK);
  377.     exit (code);
  378. }
  379.